/**
 * @param {character[][]} board
 * @return {void} Do not return anything, modify board in-place instead.
 */
 var solveSudoku = function(board) {
  const isValid = function(row,col,val,board){
    // 传入的参数有第几行第几列 当前的值 和棋盘
    for(let i = 0;i < 9;i++){
      if(board[row][i] === val){
        // 如果同一行不同列有的树和val相同就返回fanlse
        return false
      }
    }
    for(let i = 0;i < 9;i++){
      if(board[i][col] === val){
        // 如果统一列有的数字和val相同就返回false
        return false
      }
    }
    let startRow = Math.floor(row / 3) * 3 // 行起始位置
    let startCol = Math.floor(col / 3) * 3 // 列起始位置
    for(let i = startRow;i < startRow + 3;i++){
      for(let j = startCol;j < startCol + 3;j++){
        if(board[i][j] === val){ // 如果在这个范围内有等于val的就返回false
          return false
        }
      }
    }
    return true // 都不成立返回true
  }
  const backTracking = function(){
    for(let i = 0;i < board.length;i++){
      for(let j = 0;j < board[0].length;j++){
        if(board[i][j] !== '.') continue // 如果是数字就下一次循环
        for(let val = 1;val <= 9;val++){ // 从1到9 的数字
          if(isValid(i,j,`${val}`,board)){ // 判断是不是符合 用模板字符串的形式
            board[i][j] = `${val}` // 成立添加这个值
            if(backTracking()){ // 下一次判断
              return true // 成立就返回true
            }
            board[i][j] = '.'
          }
        }
        return false // 如果从1到9都没有成功返回true 就返回false
      }
    }
    // 如果都是continue 说明已经没有其他数字了 就返回true
    return true
  }
  backTracking()
  return board
};